#include <stdio.h>
int main()
{
    int i=1;
    while(i<=10)
    {
        if(5==i)
        break; //此时停止并跳出循环，即使加上{}也是作用于整个循环的
        //如果把break换成continue，那么输出：1 2 3 4 光标闪烁（进入死循环）
        //因为执行到i==5 continue的时候，又重新返回while(i<=10)，再次执行i==5 continue，又返回while…… 所以进入死循环

        printf("%d ",i); //输出：1 2 3 4 
        i++;
    } 
    return 0;
}

int main()
{
    int i=0;
    for(i=1;i<=10;i++)
    {
        if(5==i)
        break;
        //将break换成continue，输出：1 2 3 4 6 7 8 9 10 
        //因为跳过continue后面的代码，然后进入表达式的调整部分
        printf("%d ",i);//输出：1 2 3 4
    }
    return 0;
}
//for：跳过continue后面代码，然后进入表达式的调整部分
//while：跳过continue后面代码，然后进入表达式（只有判断部分）
//所以，逻辑是一样的，只不过while的调整部分在循环语句中，for的调整部分在表达式中
//若将第一段while代码的i++; 放到if语句前面，输出为：2 3 4 6 7 8 9 10 11

int main()
{
    int i=1;
    do
    {
        if(5==i)
        break; 
        //把break换成continue，输出：1 2 3 4 死循环
        //把break换成continue，并把i++放到if语句前，输出：2 3 4 6 7 8 9 10 11
        printf("%d ",i); //输出：1 2 3 4 
        i++;
    } 
    while (i<=10);
    return 0;
}

//练习
/*1️⃣计算n的阶乘 1*2*3*4……*n(不考虑溢出的事)
int main()
{
    int i=1;
    int n;
    int s=1;
    scanf("%d",&n);
    for(i=1;i<=n;i++)
    {
        s=s*i;
    }
    printf("%d\n",s);
    return 0;
}
*/
//2️⃣计算1！+2！+3！（两种方法）
int main()
{
    int i=1;
    int s=1;
    int v=0;
    for(i=1;i<=3;i++)
    {
        s=s*i;
        v=v+s;
    }
    printf("%d",v);
    return 0;
}
int main()
{
    int i=1;
    int n=1;
    int s=1;
    int v=0;
    for(n=1;n<=3;n++)
    {
        s=1;//重新初始化非常重要，若没有，输出结果则错误为15，因为n=2时进循环出循环后s=2
        for(i=1;i<=n;i++)
        {
            s=s*i;//n=2时,s=2并且n=3进入循环时初始化值仍为2
        }
        v=v+s;
    }
    printf("%d\n",v);
    return 0;
}
//所有进入嵌套for循环的变量都要重新初始化，否则下次进入循环时默认变量为上次进入后的最终值
//3️⃣在一个有序数组中查找具体的某个数字n （顺序查找法和二分查找法）
//顺序查找法
int main()
{
    int arr[]={1,2,3,4,5,6,7,8,9,10};
    int a=7;
    int i=0;
    int sz=sizeof(arr)/sizeof(arr[0]);
    for(i=0;i<sz;i++)
    {
        if(arr[i]==a)
        {
            print("找到了,下标为:%d",i);
            break;
        }
    }
    if(i==sz)
    {
        printf("找不到");
    }
    return 0;
}
//二分查找法
int main()
{
    int arr[]={1,2,3,4,5,6,7,8,9,10};
    int a=7;//举例
    int sz=sizeof(arr)/sizeof(arr[0]);
    int left=0;
    int right=sz-1;
    while(left<=right)  //left和right之间还有数字
    {
        //int mid=(left+right)/2; 一定要放在循环中，mid才会改变
        //上式可能因为值太大而溢出，导致数据丢失，结果错误
        //所以可改成： 
        int mid=left+(right-left)/2;
        if(a>arr[mid])  //向右找
        {
            left=mid+1;
        }
        else if(a<arr[mid]) //向左找
        {
            right=mid-1;
        }
        else   //a==arr[mid]
        {
            printf("找到了,下标是:%d",mid);
            break;
        }
    }
    if(left>right)
    {
        printf("找不到");
    }
    return 0;
}
//4️⃣编写代码，演示多个字符从两端移动，向中间汇聚 (可在vs2022中见)
/*
welcome to xida!!!!
###################
w#################!
we###############!!
wel#############!!!
……
*/
#include <string.h>
#include <windows.h>
#include <stdlib.h>
int main()
{
    char arr1[]="welcome to xida!!!!";//字符串有'\0'
    char arr2[]="###################";
    int left=0;
    int right=strlen(arr1)-1;//int right=sizeof(arr1)/sizeof(arr1[0])-2;  因为'\0'也算一个，详见4.c
    while(left<=right)
    {
        arr2[left]=arr1[left];
        arr2[right]=arr1[right];
        printf("%s\n",arr2);
        Sleep(1000);//防止打印太快，等待1000毫秒（1秒），头文件：<windows.h>
        //产生动态效果，在一行中字符从两边向中间汇聚：
        system("cls");//system是一个库函数，可以执行系统命令，头文件:<stdlib.h> 在code环境中无法执行，在2022中可以
        //cls:清空屏幕  (可在cmd中使用)
        left++;
        right--;
    }
    printf("%s",arr2);
    return 0;
}
//5️⃣模拟用户登录情景，并只能登三次
#include <string.h>
int main()
{
    char password[20]={0};//假设密码是字符串：abcdef
    int i=0;
    for(i=0;i<3;i++)
    {
        scanf("%s",password);
        if(strcmp(password,"abcdef")==0)//比较2个字符串是否相等，不能用==，而应用一个库函数：strcmp ，头文件:<string.h>
        {
            printf("登录成功");
            break;
        }
        else
        {
            printf("密码错误，重新输入");
        }
    }
    if(3==i)
    {
        printf("三次密码均输入错误,退出程序");
    }
    return 0;
}
//6️⃣猜数字游戏 1~100
#include <stdlib.h>
#include <time.h>
void menu()
{
    printf("*****1.play*****");
    printf("*****0.exit*****");
}
void game()
{
    //电脑生成一个随机数 1~100  
    //rand函数:0~RAND_MAX(32767)  rand()%100:0~99
    //rand()%100:0~99的原因：比如187%100=87 99%100=99
    int ret=rand()%100+1;  //1~100
    int guess=0; 
    while(1)
    {
        printf("请猜测：");
        scanf("%d",&guess);
        if(guess>ret)
        {
            printf("猜大了\n");
        }
        else if(guess<ret)
        {
            printf("猜小了\n");
        }
        else
        {
            printf("恭喜猜对了\n");
            break;
        }
    }
}
int main()
{                                   //时间戳   NULL:空指针
    srand(unsigned int time(NULL));//随机数生成起点,要放在主函数中，因为整个工程有一个即可。srand的()中变化，rand()生成的随机值才有变化
    //想多次玩游戏（至少一次）
    int input=0;
    do
    {
        //设置一个菜单
        menu();
        printf("请选择：");
        scanf("%d",&input);
        switch(input)
        {
            case 1:
            {
                game();
                break;
            }
            case 0:
            {
                printf("退出游戏\n");
                break;
            }
            default:
            {
                printf("重新选择\n");
                break;
            }
        }
    } while (input);
    return 0;
}
//7️⃣分数计算，计算1/1-1/2+1/3-1/4+1/5……+1/99-1/100的值
//分子是1，分母是1~100
int main()
{
    int a;
    double b=0.0;
    double c=0.0;
    double m=0.0;
    for(a=1;a<=100;a++)
    {
        if(a%2==0)
        b=-(1.0/a);  //重点是用浮点数
        else 
        c=1.0/a;
        m=m+b+c;
        b=0.0;
        c=0.0;
    }
    printf("%lf",m); //输出:0.688172
    return 0;
}
//简单方法：尽量不在循环里判断
int main()
{
    int a;
    double sum=0.0;
    int flag=1;
    for(a=1;a<=100;a++)
    {
        sum=sum+flag*(1.0/a);
        flag=-flag;
    }
    printf("%lf\n",sum);
    return 0;
}
//8️⃣在屏幕输出9*9乘法口诀表
//行*每一列 （列数 ——趋近——> 行数，意思是第几行就有几列）
//1*1=1 
//2*1=2 2*2=4 
//3*1=3 3*2=6 3*3=9 
//……
int main()
{
    int i,j;
    for(i=1;i<10;i++)        //打印9行
    {
        for(j=1;j<=i;j++)    //打印每1行
        {
            printf("%d*%d=%-2d ",i,j,i*j); //2位右对齐:%2d 
        }                                  //2位左对齐:%-2d
        printf("\n");
    }
    return 0;
}
//1*1=1
//1*2=2 2*2=2
//1*3=3 2*3=6 3*3=9 ....
int main()
{
    int a,b;
    for(a=1;a<10;a++)
    {
        for(b=1;b<=a;b++)
        {
            printf("%d*%d=%-2d ",b,a,a*b);//先列后行：每一列*行
        }
        printf("\n");
    }
    return 0;
}
//打印乘法口诀表，口诀行数、列数自己输入
int main()
{
    int a;
    scanf("%d",&a);
    int i,j;
    for(i=1;i<=a;i++)
    {
        for(j=1;j<=i;j++)
        {
            printf("%d*%d=%-2d ",i,j,i*j);
        }
        printf("\n");
    }
    return 0;
}